﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Cotizav.CONEXION;
using Cotizav.CONTROLADOR;
using Cotizav.PRESENTACION.DialogBox;
using Cotizav.CONTROLADOR.Otros;
using Cotizav.PRESENTACION.Equipo;
using Cotizav.PRESENTACION.Persona.Contacto;

namespace Cotizav.PRESENTACION.Cotizacion
{
    public partial class RegistroCotizacion : Form
    {
        private CLIENTE cliente; 
        private VENDEDOR vendedor;
        private SUCURSAL sucursal;
        private PERIODO periodo;
        
        private List<EQUIPO> listEquipos;
        private List<COTIZACION_DETALLE> listCotizacionDetalle;

        private List<CONTACTO> listContactos;        
        private List<CONDICION> listCondiciones;
        private List<CONDICION> listInformacionAdicional;
        
        private List<CONTACTO_COTIZACION> lisContactoCotizacion;
        private List<CONDICION_COTIZACION> lisCondicionCotizacion;

        private string selectedTipoCotizacion;

        CtrlSucursal ctSucursal;
        CtrlPeriodo ctPeriodo;
        CtrlClientes ctcliente;
        CtrlVendedor ctVendedor;
        CtrlContactos ctContacto;
        CtrlCondicion ctCondicion;
        CtrlCotizacion ctCotizacion;
        
        public RegistroCotizacion()
        {
            InitializeComponent();

            cliente = new CLIENTE();
            vendedor = new VENDEDOR();
            sucursal = new SUCURSAL();
            periodo = new PERIODO();

            listEquipos = new List<EQUIPO>();                    
            listCondiciones = new List<CONDICION>();
            listContactos = new List<CONTACTO>();
            listInformacionAdicional = new List<CONDICION>();

            lisCondicionCotizacion = new List<CONDICION_COTIZACION>();
            lisContactoCotizacion = new List<CONTACTO_COTIZACION>();
            listCotizacionDetalle = new List<COTIZACION_DETALLE>();

            ctSucursal = new CtrlSucursal();
            ctPeriodo = new CtrlPeriodo();
            ctcliente = new CtrlClientes();
            ctVendedor = new CtrlVendedor();
            ctContacto = new CtrlContactos();
            ctCotizacion = new CtrlCotizacion();
            ctCondicion = new CtrlCondicion();
        }

        private void RegistroCotizacion_Load(object sender, EventArgs e)
        {
            txtFecha.Text = DateTime.Now.ToShortDateString();

            //carga la sucursal
            cmbSucursal.DataSource = ctSucursal.getListSucursal();
            cmbSucursal.DisplayMember = "nombreSucursal";
            cmbSucursal.ValueMember = "idSucursal";
            cmbSucursal.SelectedIndex = -1;

            //carga los vendedores
            cmbVendedor.DataSource = ctVendedor.getListVendedor();
            cmbVendedor.DisplayMember = "nombre";
            cmbVendedor.ValueMember = "idVendedor";
            cmbVendedor.SelectedIndex = -1;

            //cargamos las condiciones que se establecieron por defecto

            //condicion
            //se verifica cuando el usuario elige el tipo de cotizacion

            //informacion adicional
            listInformacionAdicional = ctCondicion.getListCondicionDefecto("Información adicional");

            gridInformacionAdicional.DataSource = listInformacionAdicional;
            gridInformacionAdicional.ClearSelection();
        }

        //#region Formato
        //private void btnAddFormato_Click(object sender, EventArgs e)
        //{
        //    DialogSelectObject iuObjectSelect = new DialogSelectObject("Formato");
        //    if (iuObjectSelect.ShowDialog() == DialogResult.OK)
        //    {
        //        if (iuObjectSelect.Result != null)
        //        {
        //            List<FORMATO> selectedFormato = iuObjectSelect.Result as List<FORMATO>;
        //            listFormato = listFormato.Union(selectedFormato, new FormatoComparer()).ToList();

        //            listformatos.DataSource = listFormato;
        //            listformatos.ValueMember = "idFormato";
        //            listformatos.DisplayMember = "nombreEncabezado"; 
        //        }
        //    }
        //}

        //private void btnDelFormato_Click(object sender, EventArgs e)
        //{
        //    if (listformatos.SelectedItems.Count > 0)
        //    {
        //        foreach (Object sel in listformatos.SelectedItems)
        //        {
        //            listFormato.RemoveAll(x => x.idFormato == ((sel as FORMATO).idFormato));
        //        }

        //        listformatos.DataSource = null;
        //        listformatos.DataSource = listFormato;
        //        listformatos.ValueMember = "idFormato";
        //        listformatos.DisplayMember = "nombreEncabezado";
        //    }
        //} 
        //#endregion

        //#region Contacto
        //private void btnAddContacto_Click(object sender, EventArgs e)
        //{
        //    if (txtCliente.Tag != null)
        //    {
        //        if (!string.IsNullOrWhiteSpace(txtCliente.Tag.ToString()))
        //        {
        //            string idCliente = txtCliente.Tag.ToString();
        //            DialogSelectObject iuObjectSelect = new DialogSelectObject("Contacto", idCliente);
        //            if (iuObjectSelect.ShowDialog() == DialogResult.OK)
        //            {
        //                if (iuObjectSelect.Result != null)
        //                {
        //                    List<CONTACTO> selectedContacto = iuObjectSelect.Result as List<CONTACTO>;
        //                    listContactos = listContactos.Union(selectedContacto, new ContactoComparer()).ToList();

        //                    listcontacto.DataSource = listContactos;
        //                    listcontacto.ValueMember = "idContacto";
        //                    listcontacto.DisplayMember = "nombre";
        //                }
        //            }
        //        } 
        //    }
        //}

        //private void btnDelContacto_Click(object sender, EventArgs e)
        //{
        //    if (listcontacto.SelectedItems.Count > 0)
        //    {
        //        foreach (Object sel in listcontacto.SelectedItems)
        //        {
        //            listContactos.RemoveAll(x => x.idContacto == ((sel as CONTACTO).idContacto));
        //        }

        //        listcontacto.DataSource = null;
        //        listcontacto.DataSource = listContactos;
        //        listcontacto.ValueMember = "idContacto";
        //        listcontacto.DisplayMember = "nombre";
        //    }
        //} 
        //#endregion

        #region Condicion
        private void btnAddCondicion_Click(object sender, EventArgs e)
        {
            DialogSelectObject iuObjectSelect = new DialogSelectObject("Condicion","Alquiler","Comercial");
            if (iuObjectSelect.ShowDialog() == DialogResult.OK)
            {
                if (iuObjectSelect.Result != null)
                {
                    List<CONDICION> selectedCondicion = iuObjectSelect.Result as List<CONDICION>;
                    listCondiciones = listCondiciones.Union(selectedCondicion, new CondicionComparer()).ToList();

                    gridCondicion.DataSource = null;
                    gridCondicion.DataSource = listCondiciones;
                    gridCondicion.ClearSelection();
                }
            }
        }

        private void btnDelCondicion_Click(object sender, EventArgs e)
        {
            if (gridCondicion.SelectedRows.Count > 0)
            {
                foreach (DataGridViewRow dr in gridCondicion.SelectedRows)
                {
                    string idCond = dr.Cells["idCondicion"].Value.ToString();
                    listCondiciones.RemoveAll(x => x.idCondicion == idCond);                    
                }

                gridCondicion.DataSource = null;
                gridCondicion.DataSource = listCondiciones;
            }
        }

        private void gridCondicion_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
        {
            if (gridCondicion.DataSource != null)
            {
                gridCondicion.Columns["idCondicion"].Visible = false;
                gridCondicion.Columns["nombreCondicion"].HeaderText = "Descripción";
                gridCondicion.Columns["statusflag"].Visible = false;
                gridCondicion.Columns["eliminado"].Visible = false;
                gridCondicion.Columns["tipoCondicion"].Visible = false;
                gridCondicion.Columns["esDefecto"].Visible = false;
            }
        }

        #endregion

        #region Informacion adicional
        private void btnAddInfAdicional_Click(object sender, EventArgs e)
        {
            DialogSelectObject iuObjectSelect = new DialogSelectObject("Condicion", "Información adicional","");
            if (iuObjectSelect.ShowDialog() == DialogResult.OK)
            {
                if (iuObjectSelect.Result != null)
                {
                    List<CONDICION> selectedCondicion = iuObjectSelect.Result as List<CONDICION>;
                    listInformacionAdicional = listInformacionAdicional.Union(selectedCondicion, new CondicionComparer()).ToList();

                    gridInformacionAdicional.DataSource = null;
                    gridInformacionAdicional.DataSource = listInformacionAdicional;
                    gridInformacionAdicional.ClearSelection();
                }
            }
        }

        private void btnEliminarInfAdicional_Click(object sender, EventArgs e)
        {
            if (gridInformacionAdicional.SelectedRows.Count > 0)
            {
                foreach (DataGridViewRow dr in gridInformacionAdicional.SelectedRows)
                {
                    string idCond = dr.Cells["idCondicion"].Value.ToString();
                    listInformacionAdicional.RemoveAll(x => x.idCondicion == idCond);
                }

                gridInformacionAdicional.DataSource = null;
                gridInformacionAdicional.DataSource = listInformacionAdicional;
            }
        }

        private void gridInformacionAdicional_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
        {
            if (gridInformacionAdicional.DataSource != null)
            {
                gridInformacionAdicional.Columns["idCondicion"].Visible = false;
                gridInformacionAdicional.Columns["nombreCondicion"].HeaderText = "Descripción";
                gridInformacionAdicional.Columns["statusflag"].Visible = false;
                gridInformacionAdicional.Columns["eliminado"].Visible = false;
                gridInformacionAdicional.Columns["tipoCondicion"].Visible = false;
                gridInformacionAdicional.Columns["esDefecto"].Visible = false;
            }
        }

        #endregion

        private void btnAddEquipo_Click(object sender, EventArgs e)
        {
            if (cmbMoneda.SelectedIndex >= 0)
            {
                if (!string.IsNullOrWhiteSpace(txtTipoCambio.Text))
                {
                   if (cmbTipoCotizacion.SelectedItem.ToString() == "Alquiler")  //cotizacion x alquiler
                   {
                        AgregarEquipoAlquiler iuAddEquipoAlquiler = new AgregarEquipoAlquiler(txtTipoCambio.Text, cmbMoneda.SelectedItem.ToString());

                        if (iuAddEquipoAlquiler.ShowDialog(this) == DialogResult.OK)
                        {
                            COTIZACION_DETALLE cotDetalle = iuAddEquipoAlquiler.Result;

                            if (cotDetalle != null)
                            {
                                if (!existeEnListaCotizacion(cotDetalle))
                                {
                                    cotDetalle.secuencia = listCotizacionDetalle.Distinct(new CotizacionDetalleComparer()).Count() + 1;
                                    cotDetalle.alternativa = 1;
                                
                                    listCotizacionDetalle.Add(cotDetalle);

                                    gridCotizacionEquipos.DataSource = null;
                                    gridCotizacionEquipos.DataSource = listCotizacionDetalle;

                                    cmbMoneda.Enabled = false;
                                    txtTipoCambio.ReadOnly = true;

                                    this.setReadOnlyRows();
                                }
                                else
                                {
                                    MessageBox.Show(this, "El equipo seleccionado ya se encuentra en la lista de cotización \ny no puede ser agregado más de una vez", "Cotizav", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);
                                }
                            }                        
                        }
                    }
                    else if (cmbTipoCotizacion.SelectedItem.ToString() == "Venta") //cotizacion x venta
                    {
                        AgregarEquipoVenta iuAddEquipoVenta = new AgregarEquipoVenta(txtIGV.Text, txtTipoCambio.Text, cmbMoneda.SelectedItem.ToString());

                        if (iuAddEquipoVenta.ShowDialog(this) == DialogResult.OK)
                        {
                            COTIZACION_DETALLE cotDetalle = iuAddEquipoVenta.Result;

                            if (cotDetalle != null)
                            {
                                if (!existeEnListaCotizacion(cotDetalle))
                                {
                                    cotDetalle.secuencia = listCotizacionDetalle.Distinct(new CotizacionDetalleComparer()).Count() + 1;
                                    cotDetalle.alternativa = 1;

                                    listCotizacionDetalle.Add(cotDetalle);

                                    gridCotizacionEquipos.DataSource = null;
                                    gridCotizacionEquipos.DataSource = listCotizacionDetalle;

                                    cmbMoneda.Enabled = false;
                                    txtTipoCambio.ReadOnly = true;

                                    this.setReadOnlyRows();

                                    //se calcula el subtotal, descuento y total
                                    this.calcularSubTotal();
                                    this.calcularDescuento();
                                    this.calcularTotal();
                                }
                                else
                                {
                                    MessageBox.Show(this, "El equipo seleccionado ya se encuentra en la lista de cotización \ny no puede ser agregado más de una vez", "Cotizav", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);
                                }
                            }
                        }
                    }                   
                }
                else
                {
                    MessageBox.Show(this, "Ingrese el tipo de cambio antes de agregar un equipo", "Cotizav", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);
                }
            }
            else
            {
                MessageBox.Show(this, "Ingrese la moneda antes de agregar un equipo", "Cotizav", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);
            }
        }

        private void btnAddAlternativa_Click(object sender, EventArgs e)
        {
            if (gridCotizacionEquipos.SelectedRows.Count > 0)
            {
                DataGridViewRow selectedRow = gridCotizacionEquipos.SelectedRows[0];

                int secuencia = int.Parse(selectedRow.Cells["secuencia"].Value.ToString());
                int alternativa = int.Parse(selectedRow.Cells["alternativa"].Value.ToString());
                COTIZACION_DETALLE selectedObject = selectedRow.DataBoundItem as COTIZACION_DETALLE;

                if (cmbTipoCotizacion.SelectedIndex >= 0)
                {
                    if (alternativa == 1) //principal
                    {
                        //muestra cuadro de dialogo para registrar alternativa 
                        if (selectedObject != null)
                        {
                            if (cmbTipoCotizacion.SelectedItem.ToString() == "Alquiler")  //cotizacion x alquiler
                            {
                                AgregarEquipoAlquiler iuAddEquipo = new AgregarEquipoAlquiler(selectedObject, txtTipoCambio.Text, cmbMoneda.SelectedItem.ToString());

                                if (iuAddEquipo.ShowDialog(this) == DialogResult.OK)
                                {
                                    COTIZACION_DETALLE cotdetalle = iuAddEquipo.Result;

                                    if (cotdetalle != null)
                                    {
                                        cotdetalle.secuencia = secuencia;
                                        cotdetalle.alternativa = listCotizacionDetalle.Where(x => x.secuencia == secuencia).OrderBy(x => x.alternativa).Last().alternativa.Value + 1;

                                        COTIZACION_DETALLE temp = listCotizacionDetalle.Where(x => x.secuencia == secuencia).OrderBy(x => x.alternativa).Last();
                                        int lastIndex = listCotizacionDetalle.LastIndexOf(temp);

                                        listCotizacionDetalle.Insert(lastIndex + 1, cotdetalle);

                                        gridCotizacionEquipos.DataSource = null;
                                        gridCotizacionEquipos.DataSource = listCotizacionDetalle;

                                        cmbMoneda.Enabled = false;
                                        txtTipoCambio.ReadOnly = true;

                                        this.setReadOnlyRows();
                                    }
                                }
                            }
                            else if (cmbTipoCotizacion.SelectedItem.ToString() == "Venta")
                            {
                                AgregarEquipoVenta iuAddVenta = new AgregarEquipoVenta(selectedObject, txtIGV.Text, txtTipoCambio.Text, cmbMoneda.SelectedItem.ToString());

                                if (iuAddVenta.ShowDialog(this) == DialogResult.OK)
                                {
                                    COTIZACION_DETALLE cotdetalle = iuAddVenta.Result;

                                    if (cotdetalle != null)
                                    {
                                        cotdetalle.secuencia = secuencia;
                                        cotdetalle.alternativa = listCotizacionDetalle.Where(x => x.secuencia == secuencia).OrderBy(x => x.alternativa).Last().alternativa.Value + 1;

                                        COTIZACION_DETALLE temp = listCotizacionDetalle.Where(x => x.secuencia == secuencia).OrderBy(x => x.alternativa).Last();
                                        int lastIndex = listCotizacionDetalle.LastIndexOf(temp);

                                        listCotizacionDetalle.Insert(lastIndex + 1, cotdetalle);

                                        gridCotizacionEquipos.DataSource = null;
                                        gridCotizacionEquipos.DataSource = listCotizacionDetalle;

                                        cmbMoneda.Enabled = false;
                                        txtTipoCambio.ReadOnly = true;

                                        this.setReadOnlyRows();
                                    }
                                }
                            }
                        }
                    }
                    else
                    {
                        MessageBox.Show(this, "El equipo seleccionado no es ", "Cotizav", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);
                    } 
                }
            }
            else
            {
                MessageBox.Show(this, "Seleccione un equipo", "Cotizav", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);
            }
        }
        
        private void btnDelEquipo_Click(object sender, EventArgs e)
        {
            if (gridCotizacionEquipos.SelectedRows.Count > 0)
            {
                DataGridViewRow rowSelected = gridCotizacionEquipos.SelectedRows[0];
                int index = rowSelected.Index;

                int tmpsecuencia = listCotizacionDetalle[index].secuencia.Value;
                int tmpalternativa = listCotizacionDetalle[index].alternativa.Value;

                if (listCotizacionDetalle[index].alternativa == 1) //si no es alternativa 1
                {
                    int secuencia = listCotizacionDetalle[index].secuencia.Value;
                    listCotizacionDetalle.RemoveAll(x => x.secuencia == secuencia);

                    //ordenamos la secuencia
                    var tmpNumEquipos = listCotizacionDetalle.Distinct(new CotizacionDetalleComparer()).Select(c => new { c.secuencia.Value }).ToList();
                    int i = 1;

                    foreach (var c in tmpNumEquipos)
                    {
                        List<COTIZACION_DETALLE> tmpList = listCotizacionDetalle.Where(x => x.secuencia == c.Value).ToList();

                        foreach (COTIZACION_DETALLE tmp in tmpList)
                        {
                            tmp.secuencia = i;                            
                        }
                        i++;
                    }
                }
                else  //si es alternativa
                {
                    listCotizacionDetalle.RemoveAt(index);

                    //ordenamos las alternativas
                    List<COTIZACION_DETALLE> tmpList = listCotizacionDetalle.Where(x => x.secuencia == tmpsecuencia).ToList();
                    int j = 1;

                    foreach (COTIZACION_DETALLE tmp in tmpList)
                    {
                        tmp.alternativa = j;
                        j++;
                    }
                }                    

                if (listCotizacionDetalle.Count == 0)
                {
                    cmbMoneda.Enabled = true;
                    txtTipoCambio.ReadOnly = false;
                    gridCotizacionEquipos.DataSource = null;

                    txtSubTotal.ResetText();
                    txtValDscto.ResetText();
                    txtDscto.ResetText();
                    TxtTotal.ResetText();
                }
                else if(listCotizacionDetalle.Count > 0)
                {
                    gridCotizacionEquipos.DataSource = null;
                    gridCotizacionEquipos.DataSource = listCotizacionDetalle;

                    //verificamos si es cotizacion por venta
                    //calculamos el subtotal descuento y total 
                    if (cmbTipoCotizacion.SelectedItem.ToString() == "Venta")
                    {
                        this.calcularSubTotal();
                        this.calcularDescuento();
                        this.calcularTotal();
                    }
                }
            }
        }

        private void gridCotizacionEquipos_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e) 
        {
            if (gridCotizacionEquipos.DataSource != null)
            {
                gridCotizacionEquipos.Columns["idCotizacionDetalle"].Visible = false;
                gridCotizacionEquipos.Columns["idcotizacion"].Visible = false;
                gridCotizacionEquipos.Columns["idequipo"].Visible = false;
                gridCotizacionEquipos.Columns["secuencia"].Visible = false;
                gridCotizacionEquipos.Columns["alternativa"].Visible = false;
                gridCotizacionEquipos.Columns["nombreEquipo"].HeaderText = "Equipo";
                gridCotizacionEquipos.Columns["dsctoenDocumento"].Visible = false;
                
                gridCotizacionEquipos.Columns["codigoEquipo"].HeaderText = "Código";
                if (cmbTipoCotizacion.SelectedItem.ToString() == "Alquiler") gridCotizacionEquipos.Columns["codigoEquipo"].Visible = false;

                gridCotizacionEquipos.Columns["serieEquipo"].HeaderText = "Serie";
                if (cmbTipoCotizacion.SelectedItem.ToString() == "Alquiler") gridCotizacionEquipos.Columns["serieEquipo"].Visible = false;

                gridCotizacionEquipos.Columns["horasEquipo"].HeaderText = "Horas";
                if (cmbTipoCotizacion.SelectedItem.ToString() == "Alquiler") gridCotizacionEquipos.Columns["horasEquipo"].Visible = false;
                
                gridCotizacionEquipos.Columns["anio"].HeaderText = "Año";
                if (cmbTipoCotizacion.SelectedItem.ToString() == "Alquiler")  gridCotizacionEquipos.Columns["anio"].Visible = false;
                      
                gridCotizacionEquipos.Columns["moneda"].Visible = false;

                gridCotizacionEquipos.Columns["cantidad"].HeaderText = "Cantidad";
                gridCotizacionEquipos.Columns["cantidad"].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;                

                gridCotizacionEquipos.Columns["horaTarifa"].HeaderText = "Horas/Tarifa";
                gridCotizacionEquipos.Columns["horaTarifa"].HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleCenter;
                gridCotizacionEquipos.Columns["horaTarifa"].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
                if (cmbTipoCotizacion.SelectedItem.ToString() == "Venta") gridCotizacionEquipos.Columns["horaTarifa"].Visible = false;

                gridCotizacionEquipos.Columns["montoTarifa"].HeaderText = "Tarifa/Tipo de Tarifa";
                gridCotizacionEquipos.Columns["montoTarifa"].HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleCenter;
                gridCotizacionEquipos.Columns["montoTarifa"].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
                gridCotizacionEquipos.Columns["montoTarifa"].DefaultCellStyle.Format = "N";
                if (cmbTipoCotizacion.SelectedItem.ToString() == "Venta") gridCotizacionEquipos.Columns["montoTarifa"].Visible = false;
                
                gridCotizacionEquipos.Columns["montoTarifaExt"].Visible = false;
                gridCotizacionEquipos.Columns["montoTarifaLoc"].Visible = false;

                gridCotizacionEquipos.Columns["tarifa"].HeaderText = "Tarifa";
                gridCotizacionEquipos.Columns["tarifa"].HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleCenter;
                gridCotizacionEquipos.Columns["tarifa"].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight;
                gridCotizacionEquipos.Columns["tarifa"].DefaultCellStyle.Format = "N";
                if (cmbTipoCotizacion.SelectedItem.ToString() == "Venta") gridCotizacionEquipos.Columns["tarifa"].HeaderText = "Valor Venta";
                
                gridCotizacionEquipos.Columns["tarifaExt"].Visible = false;
                gridCotizacionEquipos.Columns["tarifaLoc"].Visible = false;

                gridCotizacionEquipos.Columns["dscto"].HeaderText = "Descuento";
                gridCotizacionEquipos.Columns["dscto"].HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleCenter;
                gridCotizacionEquipos.Columns["dscto"].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight;
                gridCotizacionEquipos.Columns["dscto"].DefaultCellStyle.Format = "N";
                if (cmbTipoCotizacion.SelectedItem.ToString() == "Venta") gridCotizacionEquipos.Columns["dscto"].Visible = false;
                
                gridCotizacionEquipos.Columns["dsctoExt"].Visible = false;
                gridCotizacionEquipos.Columns["dsctoLoc"].Visible = false;

                gridCotizacionEquipos.Columns["impuestos"].HeaderText = "I.G.V.";
                gridCotizacionEquipos.Columns["impuestos"].HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleCenter;
                gridCotizacionEquipos.Columns["impuestos"].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight;
                gridCotizacionEquipos.Columns["impuestos"].DefaultCellStyle.Format = "N";
                if (cmbTipoCotizacion.SelectedItem.ToString() == "Alquiler") gridCotizacionEquipos.Columns["impuestos"].Visible = false;

                gridCotizacionEquipos.Columns["impuestosExt"].Visible = false;
                gridCotizacionEquipos.Columns["impuestosLoc"].Visible = false;

                gridCotizacionEquipos.Columns["tarifaTotal"].HeaderText = "Tarifa Total";
                gridCotizacionEquipos.Columns["tarifaTotal"].HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleCenter;
                gridCotizacionEquipos.Columns["tarifaTotal"].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight;
                gridCotizacionEquipos.Columns["tarifaTotal"].DefaultCellStyle.Format = "N";
                if (cmbTipoCotizacion.SelectedItem.ToString() == "Venta") gridCotizacionEquipos.Columns["tarifaTotal"].HeaderText = "Precio de venta";
               
                gridCotizacionEquipos.Columns["tarifaTotalExt"].Visible = false;
                gridCotizacionEquipos.Columns["tarifaTotalLoc"].Visible = false;

                gridCotizacionEquipos.Columns["eliminado"].Visible = false;
                
                gridCotizacionEquipos.Columns["tipoTarifa"].HeaderText = "Tipo de Tarifa";
                gridCotizacionEquipos.Columns["tipoTarifa"].HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleCenter;
                gridCotizacionEquipos.Columns["tipoTarifa"].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
                gridCotizacionEquipos.Columns["tipoTarifa"].DisplayIndex = 10;
                if (cmbTipoCotizacion.SelectedItem.ToString() == "Venta") gridCotizacionEquipos.Columns["tipoTarifa"].Visible = false;

                

                gridCotizacionEquipos.Columns["EQUIPO"].Visible = false;
                gridCotizacionEquipos.Columns["COTIZACION"].Visible = false;

                //colocamos en negrita las primeras filas de secuencia
                //pintamos las celdas intercaladamente de acuerdo a la secuencia

                Color rowColor1 = System.Drawing.Color.FromArgb(255, 255, 204);
                Color rowColor2 = System.Drawing.Color.FromArgb(255, 255, 255);
                int tmpSecuencia = 0;
                int tmpAlternativa = 0;
                bool cambiaColor = false;

                foreach (DataGridViewRow dr in gridCotizacionEquipos.Rows)
                {
                    //verificamos si es secuencia y alternativa 1
                    if (Int32.Parse(dr.Cells["alternativa"].Value.ToString()) == 1)
                    {
                        //modificamos los temporales
                        tmpSecuencia = Int32.Parse(dr.Cells["secuencia"].Value.ToString());
                        tmpAlternativa = Int32.Parse(dr.Cells["alternativa"].Value.ToString());

                        //pintamos en negrita
                        dr.DefaultCellStyle.Font = new Font(gridInformacionAdicional.Font, FontStyle.Bold);

                        if (tmpSecuencia % 2 == 0)
                        {
                            cambiaColor = true;
                        }
                        else
                        {
                            cambiaColor = false;
                        }                        
                    }

                    if (Int32.Parse(dr.Cells["secuencia"].Value.ToString()) == tmpSecuencia)
                    {
                        if (cambiaColor)
                        {
                            dr.DefaultCellStyle.BackColor = rowColor1;
                        }
                        else
                        {
                            dr.DefaultCellStyle.BackColor = rowColor2;
                        }
                    }
                }
            }
        }

        internal void setReadOnlyRows()
        {
            if (gridCotizacionEquipos.Rows.Count > 0)
            {
                foreach (DataGridViewRow dr in gridCotizacionEquipos.Rows)
                {
                    dr.ReadOnly = true;
                }
            }
        }

        private bool existeEnListaCotizacion(COTIZACION_DETALLE cotDetalle)
        {
            bool result = false;
            foreach (COTIZACION_DETALLE c in listCotizacionDetalle)
            {
                if (c.idEquipo == cotDetalle.idEquipo &&
                    c.codigoEquipo == cotDetalle.codigoEquipo &&
                    c.serieEquipo == cotDetalle.serieEquipo)
                {
                    result = true;
                    break;
                }
                else
                {
                    result = false;
                }
            }

            return result;
        }

        internal void registrarCotizacion()
        {
            if (cmbTipoCotizacion.SelectedIndex >= 0)
            {
                if (!string.IsNullOrWhiteSpace(txtReferencia.Text))
                {
                    if (!string.IsNullOrWhiteSpace(txtObra.Text))
                    {
                        if (txtCliente.Tag != null)
                        {
                            if (cmbSucursal.SelectedIndex >= 0)
                            {
                                if (cmbContacto.SelectedIndex >= 0)
                                {
                                    //if (listFormato.Count > 0)
                                    //{
                                    if (listCondiciones.Count > 0)
                                    {
                                        if (listCotizacionDetalle.Count > 0)
                                        {
                                            CONTACTO selectedContacto = new CONTACTO();                                            
                                            selectedContacto = cmbContacto.SelectedItem as CONTACTO;

                                            //se registra la cotización
                                            COTIZACION cotiz = new COTIZACION()
                                            {
                                                //codigoCotizacion = 
                                                fechaRegistro = Convert.ToDateTime(txtFecha.Text),
                                                obra = txtObra.Text,
                                                referencia = txtReferencia.Text,
                                                tipoCambio = Convert.ToDecimal(txtTipoCambio.Text),
                                                moneda = cmbMoneda.SelectedItem.ToString(),
                                                igv = txtIGV.Text,
                                                idCliente = txtCliente.Tag.ToString(),
                                                nombrecliente = txtCliente.Text,
                                                idVendedor = cmbVendedor.SelectedValue.ToString(),
                                                nombreVendedor = (cmbVendedor.SelectedItem as VENDEDOR).nombre,
                                                idsucursal = cmbSucursal.SelectedValue.ToString(),
                                                nombresucursal = (cmbSucursal.SelectedItem as SUCURSAL).nombreSucursal,
                                                eliminado = 0,
                                                esAlquiler = cmbTipoCotizacion.SelectedItem.ToString() == "Alquiler" ? 'S' : ' ',
                                                esVenta = cmbTipoCotizacion.SelectedItem.ToString() == "Venta" ? 'S' : ' ',
                                            };

                                            string codigoCotizacion = ctCotizacion.registrarCotizacion(cotiz, listCotizacionDetalle, selectedContacto, listCondiciones, listInformacionAdicional);

                                            if (!string.IsNullOrWhiteSpace(codigoCotizacion))
                                            {
                                                MessageBox.Show(this, "Cotización generada.\nCódigo: " + codigoCotizacion, "Cotizav", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1);
                                            }                                         
                                        }
                                        else
                                        {
                                            MessageBox.Show(this, "La cotización no tiene equipos por cotizar", "Cotizav", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);
                                        }
                                    }
                                    else
                                    {
                                        MessageBox.Show(this, "Debe ingresar una o más condiciones para \n la elaboración del documento de cotización", "Cotizav", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);
                                    }
                                    //}
                                    //else
                                    //{
                                    //    MessageBox.Show(this, "Debe ingresar uno o más formatos para \nla elaboración del documento de cotización", "Cotizav", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);
                                    //}
                                }
                                else
                                {
                                    MessageBox.Show(this, "Debe ingresar el contacto", "Cotizav", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);
                                }
                            }
                            else
                            {
                                MessageBox.Show(this, "Seleccione la sucursal", "Cotizav", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);
                            }
                        }
                        else
                        {
                            MessageBox.Show(this, "Seleccione el cliente", "Cotizav", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);
                        }
                    }
                    else
                    {
                        MessageBox.Show(this, "Ingrese la obra", "Cotizav", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);
                    }
                }
                else
                {
                    MessageBox.Show(this, "Ingrese la referencia", "Cotizav", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);
                }
            }
            else
            {
                MessageBox.Show(this, "Seleccione el tipo de cotización", "Cotizav", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);
            }
        }

        internal bool cancelarRegistro()
        {
            bool result = false;

            if (MessageBox.Show(this.ParentForm, "¿Desea cancelar el registro de cotización?", "Cotizav", MessageBoxButtons.OKCancel, MessageBoxIcon.Question, MessageBoxDefaultButton.Button1) == DialogResult.OK)
            {
                result = true;
            }
            else
            {
                result = false;
            }

            return result;
        }

        private void tabControl1_Selected(object sender, TabControlEventArgs e)
        {
            if (e.TabPage.Text == "Detalle")
            {
                if (cmbTipoCotizacion.SelectedIndex < 0)
                {
                    MessageBox.Show(this, "Seleccione el tipo de cotización antes de agregar los equipos", "Cotizav", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);
                    tabControl1.SelectedIndex = 0;
                }
            }
        }

        private void cmbTipoCotizacion_DropDown(object sender, EventArgs e)
        {
            if (cmbTipoCotizacion.SelectedIndex >= 0)
            {
                selectedTipoCotizacion = cmbTipoCotizacion.SelectedItem.ToString(); 
            }
        }

        private void cmbTipoCotizacion_SelectionChangeCommitted(object sender, EventArgs e)
        {
            if (listCotizacionDetalle.Count > 0)
            {
                string selectingTipoCotizacion = cmbTipoCotizacion.SelectedItem.ToString();

                if (selectedTipoCotizacion != selectingTipoCotizacion)
                {
                    DialogResult dr = MessageBox.Show(this, "Al cambiar de tipo de Cotizacion se eliminarán todos los equipos agregados\n¿Esta seguro que desea continuar?", "Cotizav", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2);

                    if (dr == DialogResult.Yes)
                    {
                        selectedTipoCotizacion = cmbTipoCotizacion.SelectedItem.ToString();
                        listCotizacionDetalle.Clear();
                        gridCotizacionEquipos.DataSource = null;
                        cmbMoneda.Enabled = true;
                        txtTipoCambio.ReadOnly = false;
                    }
                    else if (dr == DialogResult.No)
                    {
                        cmbTipoCotizacion.SelectedIndex = cmbTipoCotizacion.Items.Cast<string>().ToList().IndexOf(selectedTipoCotizacion);
                    }
                } 
            }

            //mostramos o no el subtotal, descuento y total
            //mostramos las condiciones por defecto
            if (cmbTipoCotizacion.SelectedIndex >= 0)
            {
                if (cmbTipoCotizacion.SelectedItem.ToString() == "Alquiler")
                {
                    txtSubTotal.ResetText();
                    txtValDscto.ResetText();
                    txtDscto.ResetText();
                    TxtTotal.ResetText();

                    btnAddAlternativa.Enabled = true;

                    lblSubTotal.Enabled = false;
                    txtSubTotal.Enabled = false;
                    lblDscto.Enabled = false;
                    txtValDscto.Enabled = false;
                    txtDscto.Enabled = false;
                    lblTotal.Enabled = false;
                    TxtTotal.Enabled = false;

                    List<CONDICION> condicionesAlquilerDefecto = ctCondicion.getListCondicionDefecto("Alquiler");
                    List<CONDICION> condicionesComercialDefecto = ctCondicion.getListCondicionDefecto("Comercial");
                    listCondiciones = condicionesAlquilerDefecto.Union(condicionesComercialDefecto).ToList();

                    gridCondicion.DataSource = listCondiciones;
                    gridCondicion.ClearSelection();
                }
                else if (cmbTipoCotizacion.SelectedItem.ToString() == "Venta")
                {
                    btnAddAlternativa.Enabled = false;

                    lblSubTotal.Enabled = true;
                    txtSubTotal.Enabled = true;
                    lblDscto.Enabled = true;
                    txtValDscto.Enabled = true;
                    txtDscto.Enabled = true;
                    lblTotal.Enabled = true;
                    TxtTotal.Enabled = true;

                    listCondiciones = ctCondicion.getListCondicionDefecto("Comercial");

                    gridCondicion.DataSource = listCondiciones;
                    gridCondicion.ClearSelection();
                }
            }
        }

        private void calcularTotal()
        {
            if (!string.IsNullOrWhiteSpace(txtSubTotal.Text))
            {
                if (!string.IsNullOrWhiteSpace(txtDscto.Text))
                {
                    TxtTotal.Text = (Convert.ToDecimal(txtSubTotal.Text) - Convert.ToDecimal(txtDscto.Text)).ToString("N");
                }
                else
                {
                    TxtTotal.Text = txtSubTotal.Text;
                }
            }
        }

        private void calcularDescuento()
        {
            if (!string.IsNullOrWhiteSpace(txtSubTotal.Text))
            {
                if (!string.IsNullOrWhiteSpace(txtValDscto.Text))
                {
                    Decimal dscto = (Convert.ToDecimal(txtValDscto.Text) / 100) * Convert.ToDecimal(txtSubTotal.Text);
                    txtDscto.Text = dscto.ToString("N");
                }
                else
                {
                    txtDscto.Text = "0.00";
                }
            }
        }

        private void calcularSubTotal()
        {
            if (gridCotizacionEquipos.Rows.Count > 0)
            {
                decimal subtotal = 0;
                foreach (DataGridViewRow dr in gridCotizacionEquipos.Rows)
                {
                    subtotal = subtotal + Convert.ToDecimal(dr.Cells["tarifaTotal"].Value);
                }

                txtSubTotal.Text = subtotal.ToString("N");
            }
        }

        private void txtValDscto_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (char.IsDigit(e.KeyChar) || char.IsControl(e.KeyChar) || e.KeyChar == '.')
            {
                e.Handled = false;
            }
            else
            {
                e.Handled = true;
            }
        }

        private void txtValDscto_KeyUp(object sender, KeyEventArgs e)
        {
            this.calcularDescuento();
            this.calcularTotal();
        }

        private void btnBuscarCliente_Click(object sender, EventArgs e)
        {
            DialogSearchObject iuBuscarCliente = new DialogSearchObject("Cliente");

            if (iuBuscarCliente.ShowDialog(this) == DialogResult.OK)
            {
                string idcliente = iuBuscarCliente.ResultadoBusqueda;

                if (!string.IsNullOrWhiteSpace(idcliente))
                {
                    CLIENTE cli = ctcliente.getCliente(idcliente);

                    txtCliente.Text = cli.razonSocial;
                    txtCliente.Tag = cli.idCliente;

                    VENDEDOR vend = ctVendedor.getVendedor(cli.idVendedor);
                    cmbVendedor.SelectedIndex = cmbVendedor.Items.Cast<VENDEDOR>().SingleOrDefault(x => x.idVendedor == vend.idVendedor) != null ? cmbVendedor.Items.IndexOf(cmbVendedor.Items.Cast<VENDEDOR>().SingleOrDefault(x => x.idVendedor == vend.idVendedor)) : -1;

                    listContactos = ctContacto.getListContacto(cli.idCliente);

                    //verificamos si la lista de contactos tiene al menos uno
                    //caso contrario habilita la opción de otro contacto para que registre uno nuevo

                    if (listContactos.Count > 0)
                    {
                        cmbContacto.DataSource = listContactos;
                        cmbContacto.DisplayMember = "nombre";
                        cmbContacto.ValueMember = "idContacto";
                        //por defecto se elige el primer contacto de la lista
                        cmbContacto.SelectedIndex = 0;
                    }

                    //listcontacto.DataSource = listContactos;
                    //listcontacto.DisplayMember = "nombre";
                    //listcontacto.ValueMember = "idContacto";
                }
            }
        }
    }
}
